{
    "componentChunkName": "component---node-modules-gatsby-theme-primer-wiki-src-templates-post-query-js",
    "path": "/posts/cloud/cloudflare/cloudflare infra/",
    "result": {"data":{"mdx":{"id":"360ad289-edfb-54f1-8264-ca3dd36ef3e6","tableOfContents":{},"fields":{"title":"cloudflare 인프라 간단 정리","slug":"/posts/cloud/cloudflare/cloudflare infra/","url":"https://r0k.wiki/posts/cloud/cloudflare/cloudflare infra/","editUrl":"https://github.com/padawanR0k/wiki/blob/master/content/posts/cloud/cloudflare/cloudflare infra.md","lastUpdatedAt":"2026-10-04T07:54:32.000Z","lastUpdated":"10/4/2026","gitCreatedAt":"2026-10-04T07:54:32.000Z","shouldShowTitle":true},"frontmatter":{"title":"cloudflare 인프라 간단 정리","description":null,"imageAlt":null,"tags":["cloudflare"],"date":null,"dateModified":null,"language":null,"seoTitle":null,"image":null},"body":"var _excluded = [\"components\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"tags\": [\"cloudflare\"],\n  \"title\": \"cloudflare 인프라 간단 정리\",\n  \"created\": \"2026-10-03T00:00:00.000Z\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, _excluded);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"h3\", {\n    \"id\": \"cloudflare-workers-컴퓨트\"\n  }, \"Cloudflare Workers (\\uCEF4\\uD4E8\\uD2B8)\"), mdx(\"p\", null, \"V8 isolate \\uC704\\uC5D0\\uC11C \\uB3CC\\uC544\\uAC00\\uB294 \\uC11C\\uBC84\\uB9AC\\uC2A4 \\uD568\\uC218\"), mdx(\"blockquote\", null, mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, \"[!NOTE]\", \" \\uC124\\uACC4 \\uCCA0\\uD559\\n\\uCEE8\\uD14C\\uC774\\uB108\\uB098 VM \\uB300\\uC2E0 V8 isolate\\uB97C \\uC4F4 \\uC774\\uC720\\uB294 \\uCF5C\\uB4DC \\uC2A4\\uD0C0\\uD2B8\\uB97C \\uC0AC\\uC2E4\\uC0C1 \\uC5C6\\uC560\\uAE30 \\uC704\\uD574\\uC11C\\uB2E4. \\uC694\\uCCAD\\uB9C8\\uB2E4 \\uC0C8 \\uD504\\uB85C\\uC138\\uC2A4\\uB97C \\uB744\\uC6B0\\uB294 \\uB300\\uC2E0, \\uC774\\uBBF8 \\uB5A0 \\uC788\\uB294 V8 \\uC5D4\\uC9C4 \\uC548\\uC5D0 \\uACA9\\uB9AC\\uB41C \\uC2E4\\uD589 \\uCEE8\\uD14D\\uC2A4\\uD2B8\\uB9CC \\uC0C8\\uB85C \\uB9CC\\uB4E0\\uB2E4. \\uADF8 \\uB300\\uAC00\\uB85C Node.js API \\uC804\\uCCB4\\uB97C \\uC4F8 \\uC218\\uB294 \\uC5C6\\uACE0, Cloudflare\\uAC00 \\uC81C\\uACF5\\uD558\\uB294 \\uB7F0\\uD0C0\\uC784 API(fetch, D1, KV \\uBC14\\uC778\\uB529 \\uB4F1)\\uC5D0 \\uB9DE\\uCDB0 \\uCF54\\uB4DC\\uB97C \\uC9DC\\uC57C \\uD55C\\uB2E4.\")), mdx(\"h3\", {\n    \"id\": \"cloudflare-pages-호스팅\"\n  }, \"Cloudflare Pages (\\uD638\\uC2A4\\uD305)\"), mdx(\"p\", null, \"\\uC815\\uC801/SSR \\uD504\\uB860\\uD2B8\\uC5D4\\uB4DC \\uBC30\\uD3EC \\uD50C\\uB7AB\\uD3FC\"), mdx(\"h3\", {\n    \"id\": \"cloudflare-d1-데이터베이스\"\n  }, \"Cloudflare D1 (\\uB370\\uC774\\uD130\\uBCA0\\uC774\\uC2A4)\"), mdx(\"p\", null, \"SQLite \\uAE30\\uBC18 \\uC11C\\uBC84\\uB9AC\\uC2A4 DB\"), mdx(\"blockquote\", null, mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, \"[!NOTE]\", \" \\uC124\\uACC4\\uCCA0\\uD559\\n\\uC804\\uD1B5\\uC801\\uC778 \\\"\\uD56D\\uC0C1 \\uCF1C\\uC838 \\uC788\\uB294 DB \\uC11C\\uBC84\\\" \\uB300\\uC2E0, SQLite \\uD30C\\uC77C\\uC744 \\uC5E3\\uC9C0\\uC5D0 \\uBCF5\\uC81C\\uD574\\uB450\\uACE0 Worker\\uAC00 \\uBC14\\uC778\\uB529\\uC744 \\uD1B5\\uD574 \\uC9C1\\uC811 \\uC9C8\\uC758\\uD558\\uB294 \\uBC29\\uC2DD\\uC774\\uB2E4. \\uC5F0\\uACB0 \\uD480 \\uAD00\\uB9AC \\uC790\\uCCB4\\uAC00 \\uD544\\uC694 \\uC5C6\\uB2E4\\uB294 \\uAC8C \\uD575\\uC2EC\")), mdx(\"h3\", {\n    \"id\": \"cloudflare-turnstile-봇-방어\"\n  }, \"Cloudflare Turnstile (\\uBD07 \\uBC29\\uC5B4)\"), mdx(\"p\", null, \"reCAPTCHA \\uB300\\uCCB4\\uC7AC. \\\"Managed mode\\\"\\uB85C \\uC124\\uC815\\uD558\\uBA74 \\uB300\\uBD80\\uBD84\\uC758 \\uC0AC\\uC6A9\\uC790\\uC5D0\\uAC8C\\uB294 \\uCCB4\\uD06C\\uBC15\\uC2A4\\uC870\\uCC28 \\uC548 \\uBCF4\\uC778\\uB2E4.\"), mdx(\"blockquote\", null, mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, \"[!NOTE]\", \" \\uC124\\uACC4 \\uCCA0\\uD559\\n\\uC0AC\\uC6A9\\uC790 \\uB9C8\\uCC30\\uC744 \\uCD5C\\uC18C\\uD654\\uD558\\uB294 \\uAC8C \\uC124\\uACC4 \\uBAA9\\uD45C\\uB2E4. \\uBE0C\\uB77C\\uC6B0\\uC800 \\uC2E0\\uD638(\\uD551\\uAC70\\uD504\\uB9B0\\uD2B8, \\uB3D9\\uC791 \\uD328\\uD134)\\uB9CC\\uC73C\\uB85C \\uB300\\uBD80\\uBD84\\uC744 \\uD1B5\\uACFC\\uC2DC\\uD0A4\\uACE0, \\uC758\\uC2EC\\uC2A4\\uB7EC\\uC6B4 \\uD2B8\\uB798\\uD53D\\uC5D0\\uB9CC \\uCC4C\\uB9B0\\uC9C0\\uB97C \\uB744\\uC6B4\\uB2E4.\")), mdx(\"h3\", {\n    \"id\": \"cloudflare-access---zero-trust-인증\"\n  }, \"Cloudflare Access - Zero Trust (\\uC778\\uC99D)\"), mdx(\"p\", null, \"\\uC560\\uD50C\\uB9AC\\uCF00\\uC774\\uC158 \\uCF54\\uB4DC \\uBC14\\uAE65, \\uC5E3\\uC9C0 \\uB808\\uBCA8\\uC5D0\\uC11C \\uB85C\\uADF8\\uC778\\uC744 \\uAC15\\uC81C\\uD558\\uB294 \\uC11C\\uBE44\\uC2A4. \"), mdx(\"blockquote\", null, mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, \"[!NOTE]\", \" \\uC124\\uACC4 \\uCCA0\\uD559\\n\\\"VPN \\uC5C6\\uC774\\uB3C4 \\uC0AC\\uB0B4 \\uB3C4\\uAD6C\\uCC98\\uB7FC \\uD2B9\\uC815 \\uACBD\\uB85C\\uB97C \\uBCF4\\uD638\\uD55C\\uB2E4\\\"\\uB294 Zero Trust \\uBAA8\\uB378\\uC758 \\uAD6C\\uD604\\uCCB4\\uB2E4. \\uC560\\uD50C\\uB9AC\\uCF00\\uC774\\uC158(Worker/Pages) \\uCF54\\uB4DC\\uB294 \\uB85C\\uADF8\\uC778 \\uB85C\\uC9C1\\uC744 \\uC804\\uD600 \\uBAB0\\uB77C\\uB3C4 \\uB41C\\uB2E4\")));\n}\n;\nMDXContent.isMDXComponent = true;","rawBody":"---\ntags:\n  - cloudflare\ntitle: cloudflare 인프라 간단 정리\ncreated: 2026-10-03\n---\n### Cloudflare Workers (컴퓨트)\nV8 isolate 위에서 돌아가는 서버리스 함수\n> [!NOTE] 설계 철학\n> 컨테이너나 VM 대신 V8 isolate를 쓴 이유는 콜드 스타트를 사실상 없애기 위해서다. 요청마다 새 프로세스를 띄우는 대신, 이미 떠 있는 V8 엔진 안에 격리된 실행 컨텍스트만 새로 만든다. 그 대가로 Node.js API 전체를 쓸 수는 없고, Cloudflare가 제공하는 런타임 API(fetch, D1, KV 바인딩 등)에 맞춰 코드를 짜야 한다.\n\n\n### Cloudflare Pages (호스팅)\n정적/SSR 프론트엔드 배포 플랫폼\n\n\n### Cloudflare D1 (데이터베이스)\nSQLite 기반 서버리스 DB\n> [!NOTE] 설계철학\n> 전통적인 \"항상 켜져 있는 DB 서버\" 대신, SQLite 파일을 엣지에 복제해두고 Worker가 바인딩을 통해 직접 질의하는 방식이다. 연결 풀 관리 자체가 필요 없다는 게 핵심\n\n\n### Cloudflare Turnstile (봇 방어)\nreCAPTCHA 대체재. \"Managed mode\"로 설정하면 대부분의 사용자에게는 체크박스조차 안 보인다.\n\n> [!NOTE] 설계 철학\n> 사용자 마찰을 최소화하는 게 설계 목표다. 브라우저 신호(핑거프린트, 동작 패턴)만으로 대부분을 통과시키고, 의심스러운 트래픽에만 챌린지를 띄운다.\n\n\n\n### Cloudflare Access - Zero Trust (인증)\n애플리케이션 코드 바깥, 엣지 레벨에서 로그인을 강제하는 서비스. \n\n> [!NOTE] 설계 철학\n> \"VPN 없이도 사내 도구처럼 특정 경로를 보호한다\"는 Zero Trust 모델의 구현체다. 애플리케이션(Worker/Pages) 코드는 로그인 로직을 전혀 몰라도 된다\n","excerpt":"Cloudflare Workers (컴퓨트) V8 isolate 위에서 돌아가는 서버리스 함수 !NOTE  설계 철학\n컨테이너나 VM 대신 V8 isolate를 쓴 이유는 콜드 스타트를 사실상 없애기 위해서다. 요청마다 새 프로세스를 띄우는 대신, …","outboundReferences":[],"inboundReferences":[]},"tagsOutbound":{"nodes":[{"frontmatter":{"title":"cloudflare 인프라 간단 정리","tags":["cloudflare"]},"fields":{"slug":"/posts/cloud/cloudflare/cloudflare infra/","title":"cloudflare 인프라 간단 정리","lastUpdated":"10/4/2026","lastUpdatedAt":"2026-10-04T07:54:32.000Z","gitCreatedAt":"2026-10-04T07:54:32.000Z"}},{"frontmatter":{"title":"github 블로그에 도메인 연결하기 by cloudflare","tags":["cloudflare"]},"fields":{"slug":"/posts/cloud/cloudflare/my-dns/","title":"github 블로그에 도메인 연결하기 by cloudflare","lastUpdated":"11/19/2022","lastUpdatedAt":"2022-11-19T05:03:07.000Z","gitCreatedAt":"2022-10-29T10:25:02.000Z"}}]}},"pageContext":{"tags":["cloudflare"],"slug":"/posts/cloud/cloudflare/cloudflare infra/","sidebarItems":[{"title":"","items":[{"title":"Recently Updated","url":"/latest/","collapse":true,"indent":false,"items":[{"title":"10-04: pnpm 11은 package.json의 pnpm 필드를 경고 없이 무시한다","url":"/posts/관찰/2026-09-30-pnpm11-package-json-pnpm-필드-무시/"},{"title":"10-04: tsconfig exclude는 extends 시 병합이 아니라 교체다","url":"/posts/관찰/2026-09-30-tsconfig-exclude는-병합이-아니라-교체/"},{"title":"10-04: cloudflare 인프라 간단 정리","url":"/posts/cloud/cloudflare/cloudflare infra/"},{"title":"09-06: 일본어 폰트·타이포그래피 - 한국인 웹 개발자가 자주 놓치는 것들","url":"/posts/frontend/일본어 폰트-타이포그래피 가이드/"},{"title":"08-23: 에이전트 프롬프트를 잘 작성한다는게 뭘까?","url":"/posts/ai/agent-prompting/"},{"title":"07-27: 자바스크립트 데드 코드 제거","url":"/posts/javascript/자바스크립트 데드 코드 제거/"},{"title":"07-05: 관찰 가능성 - 카디널리티와 디멘셔널리티","url":"/posts/monitoring/cardinality-and-dimensionality/"},{"title":"06-30: 다국어 페이지 작업시 주의해야할 것 - hreflang / canonical","url":"/posts/seo/hreflang-canonical/"},{"title":"05-24: dynamic-range-limit - HDR 이미지/비디오 밝기 제한 CSS 속성","url":"/posts/web/dynamic-range-limit/"},{"title":"04-18: SEO 클로킹과 콘텐츠 게이팅","url":"/posts/seo/seo-cloaking-and-content-gating/"}]}]},{"title":"Tags","items":[{"title":"Readme","type":"tag","url":"/tags/readme/","items":[{"title":"📝 r0k Wiki","url":"/"}]},{"title":"SEO","type":"tag","url":"/tags/seo/","items":[{"title":"다국어 페이지 작업시 주의해야할 것 - hreflang / canonical","url":"/posts/seo/hreflang-canonical/"},{"title":"SEO 클로킹과 콘텐츠 게이팅","url":"/posts/seo/seo-cloaking-and-content-gating/"}]},{"title":"Sentry","type":"tag","url":"/tags/sentry/","items":[{"title":"Sentry","url":"/posts/monitoring/sentry/"}]},{"title":"Web API","type":"tag","url":"/tags/web-api/","items":[{"title":"Blob","url":"/Web_API/Blob/"},{"title":"DOMMatrixReadOnly","url":"/Web_API/DOMMatrixReadOnly/"}]},{"title":"ai","type":"tag","url":"/tags/ai/","items":[{"title":"에이전트 프롬프트를 잘 작성한다는게 뭘까?","url":"/posts/ai/agent-prompting/"}]},{"title":"cloudflare","type":"tag","url":"/tags/cloudflare/","items":[{"title":"cloudflare 인프라 간단 정리","url":"/posts/cloud/cloudflare/cloudflare infra/"},{"title":"github 블로그에 도메인 연결하기 by cloudflare","url":"/posts/cloud/cloudflare/my-dns/"}]},{"title":"css","type":"tag","url":"/tags/css/","items":[{"title":"일본어 폰트·타이포그래피 - 한국인 웹 개발자가 자주 놓치는 것들","url":"/posts/frontend/일본어 폰트-타이포그래피 가이드/"},{"title":"dynamic-range-limit - HDR 이미지/비디오 밝기 제한 CSS 속성","url":"/posts/web/dynamic-range-limit/"}]},{"title":"git","type":"tag","url":"/tags/git/","items":[{"title":"git 딥다이브 - git branch, tag, HEAD","url":"/posts/study/codesoom-git/git-deep-dive-01/"},{"title":"git 딥다이브 - git merge, rebase","url":"/posts/study/codesoom-git/git-deep-dive-02/"},{"title":"git 딥다이브 - history","url":"/posts/study/codesoom-git/git-deep-dive-03/"}]},{"title":"i18n","type":"tag","url":"/tags/i-18-n/","items":[{"title":"일본어 폰트·타이포그래피 - 한국인 웹 개발자가 자주 놓치는 것들","url":"/posts/frontend/일본어 폰트-타이포그래피 가이드/"},{"title":"다국어 페이지 작업시 주의해야할 것 - hreflang / canonical","url":"/posts/seo/hreflang-canonical/"}]},{"title":"javascript","type":"tag","url":"/tags/javascript/","items":[{"title":"프론트엔드 성능 최적화 팁 기록","url":"/posts/frontend/performance-tip/"},{"title":"callback부터 async await까지 - Javascript 비동기","url":"/posts/javascript/asynchronous/"},{"title":"웹팩을 쓰는 이유와 사용법 정리","url":"/posts/javascript/webpack/"},{"title":"일본어 폰트·타이포그래피 - 한국인 웹 개발자가 자주 놓치는 것들","url":"/posts/frontend/일본어 폰트-타이포그래피 가이드/"},{"title":"자바스크립트 데드 코드 제거","url":"/posts/javascript/자바스크립트 데드 코드 제거/"},{"title":"웹에서\b영상 재생을 하기 위한 주변 지식","url":"/posts/web/video player/"},{"title":"useTransition과 Suspense의 내부 상호작용","url":"/posts/frontend/use-transition-suspense/"}]},{"title":"my-setting","type":"tag","url":"/tags/my-setting/","items":[{"title":"개발 생산성을 위한 내 개발 환경 세팅 기록","url":"/posts/my-setting/"}]},{"title":"react","type":"tag","url":"/tags/react/","items":[{"title":"useTransition과 Suspense의 내부 상호작용","url":"/posts/frontend/use-transition-suspense/"}]},{"title":"react-query","type":"tag","url":"/tags/react-query/","items":[{"title":"react-query 동작 안하는 이슈 해결","url":"/posts/library/react-query/fail-request/"}]},{"title":"tip","type":"tag","url":"/tags/tip/","items":[{"title":"git 관련 팁 정리","url":"/posts/tip/git/"},{"title":"내가 써먹으려고 정리한 단축키 & 명령어 모음","url":"/posts/tip/shortcut/"},{"title":"webstorm 사용 팁","url":"/posts/tip/webstorm/"},{"title":"나만의 업무 습관 정리","url":"/posts/tip/나만의 업무 습관 정리/"},{"title":"키보드 안쓰기","url":"/posts/tip/키보드 안쓰기/"}]},{"title":"webstorm","type":"tag","url":"/tags/webstorm/","items":[{"title":"git 관련 팁 정리","url":"/posts/tip/git/"},{"title":"webstorm 사용 팁","url":"/posts/tip/webstorm/"}]},{"title":"개선","type":"tag","url":"/tags/개선/","items":[{"title":"eslint에서 biome로","url":"/posts/library/biome/"},{"title":"자바스크립트 데드 코드 제거","url":"/posts/javascript/자바스크립트 데드 코드 제거/"},{"title":"레거시를 더 나은 환경으로 만들기","url":"/posts/tip/레거시를 더 나은 환경으로 만들기/"}]},{"title":"관찰","type":"tag","url":"/tags/관찰/","items":[{"title":"pnpm 11은 package.json의 pnpm 필드를 경고 없이 무시한다","url":"/posts/관찰/2026-09-30-pnpm11-package-json-pnpm-필드-무시/"},{"title":"tsconfig exclude는 extends 시 병합이 아니라 교체다","url":"/posts/관찰/2026-09-30-tsconfig-exclude는-병합이-아니라-교체/"}]},{"title":"단축키","type":"tag","url":"/tags/단축키/","items":[{"title":"내가 써먹으려고 정리한 단축키 & 명령어 모음","url":"/posts/tip/shortcut/"}]},{"title":"디깅","type":"tag","url":"/tags/디깅/","items":[{"title":"모노레포에서 서로 다른 React 버전 사용시 에러","url":"/posts/error/모노레포에서 서로 다른 react 버전 사용시 에러/"}]},{"title":"모니터링","type":"tag","url":"/tags/모니터링/","items":[{"title":"관찰 가능성 - 카디널리티와 디멘셔널리티","url":"/posts/monitoring/cardinality-and-dimensionality/"},{"title":"프론트엔드 모니터링 - datadog RUM 알아보기","url":"/posts/monitoring/datadog RUM/"}]},{"title":"설정무시","type":"tag","url":"/tags/설정무시/","items":[{"title":"pnpm 11은 package.json의 pnpm 필드를 경고 없이 무시한다","url":"/posts/관찰/2026-09-30-pnpm11-package-json-pnpm-필드-무시/"},{"title":"tsconfig exclude는 extends 시 병합이 아니라 교체다","url":"/posts/관찰/2026-09-30-tsconfig-exclude는-병합이-아니라-교체/"}]},{"title":"성능최적화","type":"tag","url":"/tags/성능최적화/","items":[{"title":"프론트엔드 성능 최적화 팁 기록","url":"/posts/frontend/performance-tip/"}]},{"title":"오브젝트","type":"tag","url":"/tags/오브젝트/","items":[{"title":"오트젝트 01 객체, 설계","url":"/posts/books/object/오브젝트-01/"},{"title":"오트젝트 03 역할, 책임, 협력","url":"/posts/books/object/오브젝트-03/"},{"title":"오트젝트 02 객체지향 프로그래밍","url":"/posts/books/object/오브젝트-02/"},{"title":"오트젝트 04 설계 품질과 트레이드 오프","url":"/posts/books/object/오브젝트-04/"},{"title":"오트젝트 05 책임 할당하기","url":"/posts/books/object/오브젝트-05/"},{"title":"오트젝트 06 메시지와 인터페이스","url":"/posts/books/object/오브젝트-06/"}]},{"title":"정규언어","type":"tag","url":"/tags/정규언어/","items":[{"title":"정규언어","url":"/posts/regex/regular-language/"}]},{"title":"정규표현식","type":"tag","url":"/tags/정규표현식/","items":[{"title":"정규표현식 - 03. 프로그래머를 위한 고급 정규표현식","url":"/posts/regex/regex_03/"},{"title":"정규표현식 - 01. 입문 정규표현식","url":"/posts/regex/regex_01/"},{"title":"정규표현식 - 02. 정규표현식의 역사","url":"/posts/regex/regex_02/"}]},{"title":"프롬프팅","type":"tag","url":"/tags/프롬프팅/","items":[{"title":"에이전트 프롬프트를 잘 작성한다는게 뭘까?","url":"/posts/ai/agent-prompting/"}]},{"title":"플레이어","type":"tag","url":"/tags/플레이어/","items":[{"title":"웹에서\b영상 재생을 하기 위한 주변 지식","url":"/posts/web/video player/"}]}]}],"tagsGroups":[{"title":"Readme","type":"tag","url":"/tags/readme/","items":[{"title":"📝 r0k Wiki","url":"/"}]},{"title":"SEO","type":"tag","url":"/tags/seo/","items":[{"title":"다국어 페이지 작업시 주의해야할 것 - hreflang / canonical","url":"/posts/seo/hreflang-canonical/"},{"title":"SEO 클로킹과 콘텐츠 게이팅","url":"/posts/seo/seo-cloaking-and-content-gating/"}]},{"title":"Sentry","type":"tag","url":"/tags/sentry/","items":[{"title":"Sentry","url":"/posts/monitoring/sentry/"}]},{"title":"Web API","type":"tag","url":"/tags/web-api/","items":[{"title":"Blob","url":"/Web_API/Blob/"},{"title":"DOMMatrixReadOnly","url":"/Web_API/DOMMatrixReadOnly/"}]},{"title":"ai","type":"tag","url":"/tags/ai/","items":[{"title":"에이전트 프롬프트를 잘 작성한다는게 뭘까?","url":"/posts/ai/agent-prompting/"}]},{"title":"cloudflare","type":"tag","url":"/tags/cloudflare/","items":[{"title":"cloudflare 인프라 간단 정리","url":"/posts/cloud/cloudflare/cloudflare infra/"},{"title":"github 블로그에 도메인 연결하기 by cloudflare","url":"/posts/cloud/cloudflare/my-dns/"}]},{"title":"css","type":"tag","url":"/tags/css/","items":[{"title":"일본어 폰트·타이포그래피 - 한국인 웹 개발자가 자주 놓치는 것들","url":"/posts/frontend/일본어 폰트-타이포그래피 가이드/"},{"title":"dynamic-range-limit - HDR 이미지/비디오 밝기 제한 CSS 속성","url":"/posts/web/dynamic-range-limit/"}]},{"title":"git","type":"tag","url":"/tags/git/","items":[{"title":"git 딥다이브 - git branch, tag, HEAD","url":"/posts/study/codesoom-git/git-deep-dive-01/"},{"title":"git 딥다이브 - git merge, rebase","url":"/posts/study/codesoom-git/git-deep-dive-02/"},{"title":"git 딥다이브 - history","url":"/posts/study/codesoom-git/git-deep-dive-03/"}]},{"title":"i18n","type":"tag","url":"/tags/i-18-n/","items":[{"title":"일본어 폰트·타이포그래피 - 한국인 웹 개발자가 자주 놓치는 것들","url":"/posts/frontend/일본어 폰트-타이포그래피 가이드/"},{"title":"다국어 페이지 작업시 주의해야할 것 - hreflang / canonical","url":"/posts/seo/hreflang-canonical/"}]},{"title":"javascript","type":"tag","url":"/tags/javascript/","items":[{"title":"프론트엔드 성능 최적화 팁 기록","url":"/posts/frontend/performance-tip/"},{"title":"callback부터 async await까지 - Javascript 비동기","url":"/posts/javascript/asynchronous/"},{"title":"웹팩을 쓰는 이유와 사용법 정리","url":"/posts/javascript/webpack/"},{"title":"일본어 폰트·타이포그래피 - 한국인 웹 개발자가 자주 놓치는 것들","url":"/posts/frontend/일본어 폰트-타이포그래피 가이드/"},{"title":"자바스크립트 데드 코드 제거","url":"/posts/javascript/자바스크립트 데드 코드 제거/"},{"title":"웹에서\b영상 재생을 하기 위한 주변 지식","url":"/posts/web/video player/"},{"title":"useTransition과 Suspense의 내부 상호작용","url":"/posts/frontend/use-transition-suspense/"}]},{"title":"my-setting","type":"tag","url":"/tags/my-setting/","items":[{"title":"개발 생산성을 위한 내 개발 환경 세팅 기록","url":"/posts/my-setting/"}]},{"title":"react","type":"tag","url":"/tags/react/","items":[{"title":"useTransition과 Suspense의 내부 상호작용","url":"/posts/frontend/use-transition-suspense/"}]},{"title":"react-query","type":"tag","url":"/tags/react-query/","items":[{"title":"react-query 동작 안하는 이슈 해결","url":"/posts/library/react-query/fail-request/"}]},{"title":"tip","type":"tag","url":"/tags/tip/","items":[{"title":"git 관련 팁 정리","url":"/posts/tip/git/"},{"title":"내가 써먹으려고 정리한 단축키 & 명령어 모음","url":"/posts/tip/shortcut/"},{"title":"webstorm 사용 팁","url":"/posts/tip/webstorm/"},{"title":"나만의 업무 습관 정리","url":"/posts/tip/나만의 업무 습관 정리/"},{"title":"키보드 안쓰기","url":"/posts/tip/키보드 안쓰기/"}]},{"title":"webstorm","type":"tag","url":"/tags/webstorm/","items":[{"title":"git 관련 팁 정리","url":"/posts/tip/git/"},{"title":"webstorm 사용 팁","url":"/posts/tip/webstorm/"}]},{"title":"개선","type":"tag","url":"/tags/개선/","items":[{"title":"eslint에서 biome로","url":"/posts/library/biome/"},{"title":"자바스크립트 데드 코드 제거","url":"/posts/javascript/자바스크립트 데드 코드 제거/"},{"title":"레거시를 더 나은 환경으로 만들기","url":"/posts/tip/레거시를 더 나은 환경으로 만들기/"}]},{"title":"관찰","type":"tag","url":"/tags/관찰/","items":[{"title":"pnpm 11은 package.json의 pnpm 필드를 경고 없이 무시한다","url":"/posts/관찰/2026-09-30-pnpm11-package-json-pnpm-필드-무시/"},{"title":"tsconfig exclude는 extends 시 병합이 아니라 교체다","url":"/posts/관찰/2026-09-30-tsconfig-exclude는-병합이-아니라-교체/"}]},{"title":"단축키","type":"tag","url":"/tags/단축키/","items":[{"title":"내가 써먹으려고 정리한 단축키 & 명령어 모음","url":"/posts/tip/shortcut/"}]},{"title":"디깅","type":"tag","url":"/tags/디깅/","items":[{"title":"모노레포에서 서로 다른 React 버전 사용시 에러","url":"/posts/error/모노레포에서 서로 다른 react 버전 사용시 에러/"}]},{"title":"모니터링","type":"tag","url":"/tags/모니터링/","items":[{"title":"관찰 가능성 - 카디널리티와 디멘셔널리티","url":"/posts/monitoring/cardinality-and-dimensionality/"},{"title":"프론트엔드 모니터링 - datadog RUM 알아보기","url":"/posts/monitoring/datadog RUM/"}]},{"title":"설정무시","type":"tag","url":"/tags/설정무시/","items":[{"title":"pnpm 11은 package.json의 pnpm 필드를 경고 없이 무시한다","url":"/posts/관찰/2026-09-30-pnpm11-package-json-pnpm-필드-무시/"},{"title":"tsconfig exclude는 extends 시 병합이 아니라 교체다","url":"/posts/관찰/2026-09-30-tsconfig-exclude는-병합이-아니라-교체/"}]},{"title":"성능최적화","type":"tag","url":"/tags/성능최적화/","items":[{"title":"프론트엔드 성능 최적화 팁 기록","url":"/posts/frontend/performance-tip/"}]},{"title":"오브젝트","type":"tag","url":"/tags/오브젝트/","items":[{"title":"오트젝트 01 객체, 설계","url":"/posts/books/object/오브젝트-01/"},{"title":"오트젝트 03 역할, 책임, 협력","url":"/posts/books/object/오브젝트-03/"},{"title":"오트젝트 02 객체지향 프로그래밍","url":"/posts/books/object/오브젝트-02/"},{"title":"오트젝트 04 설계 품질과 트레이드 오프","url":"/posts/books/object/오브젝트-04/"},{"title":"오트젝트 05 책임 할당하기","url":"/posts/books/object/오브젝트-05/"},{"title":"오트젝트 06 메시지와 인터페이스","url":"/posts/books/object/오브젝트-06/"}]},{"title":"정규언어","type":"tag","url":"/tags/정규언어/","items":[{"title":"정규언어","url":"/posts/regex/regular-language/"}]},{"title":"정규표현식","type":"tag","url":"/tags/정규표현식/","items":[{"title":"정규표현식 - 03. 프로그래머를 위한 고급 정규표현식","url":"/posts/regex/regex_03/"},{"title":"정규표현식 - 01. 입문 정규표현식","url":"/posts/regex/regex_01/"},{"title":"정규표현식 - 02. 정규표현식의 역사","url":"/posts/regex/regex_02/"}]},{"title":"프롬프팅","type":"tag","url":"/tags/프롬프팅/","items":[{"title":"에이전트 프롬프트를 잘 작성한다는게 뭘까?","url":"/posts/ai/agent-prompting/"}]},{"title":"플레이어","type":"tag","url":"/tags/플레이어/","items":[{"title":"웹에서\b영상 재생을 하기 위한 주변 지식","url":"/posts/web/video player/"}]}],"latestPosts":[{"fields":{"slug":"/posts/관찰/2026-09-30-pnpm11-package-json-pnpm-필드-무시/","title":"pnpm 11은 package.json의 pnpm 필드를 경고 없이 무시한다","lastUpdatedAt":"2026-10-04T07:54:32.000Z","lastUpdated":"10/4/2026"},"frontmatter":{"draft":false,"tags":["관찰","설정무시"]}},{"fields":{"slug":"/posts/관찰/2026-09-30-tsconfig-exclude는-병합이-아니라-교체/","title":"tsconfig exclude는 extends 시 병합이 아니라 교체다","lastUpdatedAt":"2026-10-04T07:54:32.000Z","lastUpdated":"10/4/2026"},"frontmatter":{"draft":false,"tags":["관찰","설정무시"]}},{"fields":{"slug":"/posts/cloud/cloudflare/cloudflare infra/","title":"cloudflare 인프라 간단 정리","lastUpdatedAt":"2026-10-04T07:54:32.000Z","lastUpdated":"10/4/2026"},"frontmatter":{"draft":false,"tags":["cloudflare"]}},{"fields":{"slug":"/posts/frontend/일본어 폰트-타이포그래피 가이드/","title":"일본어 폰트·타이포그래피 - 한국인 웹 개발자가 자주 놓치는 것들","lastUpdatedAt":"2026-09-06T06:00:56.000Z","lastUpdated":"9/6/2026"},"frontmatter":{"draft":false,"tags":["i18n","css","javascript"]}},{"fields":{"slug":"/posts/ai/agent-prompting/","title":"에이전트 프롬프트를 잘 작성한다는게 뭘까?","lastUpdatedAt":"2026-08-23T05:57:19.000Z","lastUpdated":"8/23/2026"},"frontmatter":{"draft":false,"tags":["ai","프롬프팅"]}},{"fields":{"slug":"/posts/javascript/자바스크립트 데드 코드 제거/","title":"자바스크립트 데드 코드 제거","lastUpdatedAt":"2026-07-27T01:49:45.000Z","lastUpdated":"7/27/2026"},"frontmatter":{"draft":false,"tags":["javascript","개선"]}},{"fields":{"slug":"/posts/monitoring/cardinality-and-dimensionality/","title":"관찰 가능성 - 카디널리티와 디멘셔널리티","lastUpdatedAt":"2026-07-05T07:49:54.000Z","lastUpdated":"7/5/2026"},"frontmatter":{"draft":false,"tags":["모니터링"]}},{"fields":{"slug":"/posts/seo/hreflang-canonical/","title":"다국어 페이지 작업시 주의해야할 것 - hreflang / canonical","lastUpdatedAt":"2026-06-30T12:28:37.000Z","lastUpdated":"6/30/2026"},"frontmatter":{"draft":false,"tags":["SEO","i18n"]}},{"fields":{"slug":"/posts/web/dynamic-range-limit/","title":"dynamic-range-limit - HDR 이미지/비디오 밝기 제한 CSS 속성","lastUpdatedAt":"2026-05-24T04:36:13.000Z","lastUpdated":"5/24/2026"},"frontmatter":{"draft":false,"tags":["css"]}},{"fields":{"slug":"/posts/seo/seo-cloaking-and-content-gating/","title":"SEO 클로킹과 콘텐츠 게이팅","lastUpdatedAt":"2026-04-18T07:10:38.000Z","lastUpdated":"4/18/2026"},"frontmatter":{"draft":false,"tags":["SEO"]}}]}},
    "staticQueryHashes": ["2320115945","2650345336","3495835395","451533639"]}